<?php
/**
 * 掲示板・コメント投稿モジュール
 * modYForum
 */
class YForum {

	public $IsAccept;
	public $CommentOrder;
	public $CommentMax;
	public $Article;

	public $CommentTable;


	public function __construct () {
		$this->IsAccept = false;
		$this->CommentMax = 0;
		$this->CommentOrder = 0;
		$this->Article = null;
		$this->CommentTable = 'blog_comments';
	}

	/**
	 * コメントの数を取得する
	 */
	public function getCommentCount ($ID, $Accept = true) {
		$Data['ArticleID'] = (int)$ID;

		// コメントに承認が必要かどうか判断する
		if ($Accept && $this->IsAccept) {
			$Data['IsAccept'] = 1;
		}
		
		Y('Helper.loadAction', 'ConnectDB', array(
			'query'=>'select',
			'table'=>$this->CommentTable,
			'column'=>'count(ID)',
			'data'=>$Data,
		));
		
		$Cnt = Y('Helper.list.ConnectDB.com.Result');
		return $Cnt['count(ID)'];
	}

	/**
	 * コメントの一覧を取得する
	 * コメント投稿はこのメソッドの使用後のみとなる。
	 */
	public function getComments ($ID) {
		if (!$ID = (int)$ID) {
			throw new YuToriException ('コメント取得用のIDが不正です。');
		}

		// LastViewを更新
		Y('Helper.loadAction', 'session');
		$BlogSession = Y('Helper.list.session.Vars.Blog');
		$BlogSession['LastView'] = time();
		Y('Helper.list.session.Vars.Blog', $BlogSession);

		// コメント「表示しない」の場合
		if ($this->Article['IsComment'] == 0) {
			return array();
		}

		$Where = 'ArticleID='.((int)$ID);

		$Order = $this->CommentOrder;
		if ($IsAccept = $this->IsAccept) {
			$Where .= ' AND IsAccept = 1';
		} else {
			$Where .= ' AND IsAccept != 2';
		}

		Y('Helper.loadAction', 'ConnectDB', array(
			'query'=>'select',
			'table'=>$this->CommentTable,
			'where'=>$Where,
			'order'=>($Order)?('RegistTime DESC'):('RegistTime'),
		));
		
		return Y('Helper.list.ConnectDB.com.ResultAll');
	}

	/**
	 * コメントの投稿を受け付ける
	 */
	public function receiveComment () {
		// 出力をxmlに変更
		Y('Helper.loadAction', 'xmloutput');
		
		Y('Helper.loadAction', 'session');

		if (!$ArticleID = Y('Request.POST.ArticleID')) {
			Y('Output.Message', 'リクエストが不正です。');
			return true;
		}
		
		// クッキーチェック
		if (!Y('Helper.list.session.Vars.Blog.LastView')) {
			Y('Output.Message', 'クッキーの受信に失敗しました。'."\n".'クッキーを無効にしている場合は、有効に設定してください。');
			return true;
		}

		// コメントを受け付けるかどうか
		if ($this->Article['IsComment'] != 2) {
			Y('Output.Message', 'この記事はコメントを受け付けていません。');
			return true;
		}

		// 連投チェック
		if (time() - Y('Helper.list.session.Vars.Blog.LastComment') < 60) {
			Y('Output.Message', 'コメントの投稿は１分以上間を開けてください。');
			return true;
		}

		// コメントが最大数に到達していないか
		if ($Max = $this->CommentMax) {
			$Now = $this->getCommentCount($ArticleID, false);
			if ($Max <= $Now) {
				Y('Output.Message', 'コメントが最大数に到達しています。');
				return true;
			}
		}


		// 入力バリデート
		$YMLReader = new YamlReader ();
		Y('Helper.loadAction', 'Validate', $YMLReader->Load(dirname(__FILE__).'/../editor/receivecomment.yml'));
		$ComData = Y('Helper.List.Validate.exec', Y('Request.Post'));
		if ($Error = Y('Helper.List.Validate.getError')) {
			Y('Output.Message', $Error);
			return true;
		}

		$ComData['ID'] = 0;
		if (!$ComData['Host'] = Y('Request.Server.REMOTE_HOST')) $ComData['Host'] = Y('Request.Server.REMOTE_ADDR');
		$ComData['RegistTime'] = time();
		$ComData['IsAccept'] = 0;

		// セッション保存
		Y('Helper.list.session.Vars.Blog.LastCommentName+', $ComData['Name']);
		Y('Helper.list.session.Vars.Blog.LastCommentURL+', $ComData['URL']);
		Y('Helper.list.session.Vars.Blog.LastCommentEmail+', $ComData['Email']);
	
		// 投稿処理
		Y('Helper.list.ConnectDB', array(
			'query'=>'insert',
			'table'=>$this->CommentTable,
			'data'=>$ComData,
		));

		Y('Helper.list.session.Vars.Blog.LastComment+', time());

		// 承認制でない場合、再読み込みの要求
		if ($this->IsAccept) {
			Y('Output.Message', "投稿しました。\n投稿内容は管理者の承認後に反映されます。");
			return true;
		} else {
			Y('Output.Message', '投稿しました。');
			Y('Helper.List.XmlOutput.Xml', array('reload'=>'necessary'));
			return true;
		}
	}

    /**
     * 最新コメントを取得する
     */
    public function getLatestComments ($Num) {
            // 承認制かどうかで動作が変わる
            if ($IsAccept = $this->IsAccept) {
                    $Where = '(a.IsAccept = 1)';
            } else {
                    $Where = '(a.IsAccept != 2)';
            }

            // 後の条件は、記事が非表示設定もしくはコメント非表示設定がないか。
            Y('Helper.loadAction', 'ConnectDB', array(
                    'query'=>'select',
                    'table'=>array('blog_comments AS a', 'left'=>'blog_articles AS b', 'on'=>'a.ArticleID=b.ID'),
                    'column'=>'a.*',
                    'where'=>$Where .' AND b.IsOpen = 1 AND b.IsComment != 0',
                    'order'=>'RegistTime DESC',
                    'limit'=>(int)$Num,
            ));

            return Y('Helper.list.ConnectDB.com.ResultAll');
    }
}
?>